
/*
 * Licensed Materials - Property of IBM
 *
 * trousers - An open source TCG Software Stack
 *
 * (C) Copyright International Business Machines Corp. 2004, 2005, 2007
 *
 */

#ifndef _TROUSERS_TYPES_H_
#define _TROUSERS_TYPES_H_

#define TCPA_NONCE_SIZE		sizeof(TCPA_NONCE)
#define TCPA_DIGEST_SIZE	sizeof(TCPA_DIGEST)
#define TCPA_ENCAUTH_SIZE	sizeof(TCPA_ENCAUTH)
#define TCPA_DIRVALUE_SIZE	sizeof(TCPA_DIRVALUE)
#define TCPA_AUTHDATA_SIZE	sizeof(TCPA_AUTHDATA)
#define TPM_NONCE_SIZE		TCPA_NONCE_SIZE
#define TPM_DIGEST_SIZE		TCPA_DIGEST_SIZE
#define TPM_ENCAUTH_SIZE	TCPA_ENCAUTH_SIZE
#define TPM_DIRVALUE_SIZE	TCPA_DIRVALUE_SIZE
#define TPM_AUTHDATA_SIZE	TCPA_AUTHDATA_SIZE

#define TSS_FLAG_MIGRATABLE	(migratable)
#define TSS_FLAG_VOLATILE	(volatileKey)
#define TSS_FLAG_REDIRECTION	(redirection)

/* return codes */
#define TCPA_E_INAPPROPRIATE_ENC	TCPA_E_NEED_SELFTEST

#define TSS_ERROR_LAYER(x)	(x & 0x3000)
#define TSS_ERROR_CODE(x)	(x & TSS_MAX_ERROR)

#ifdef TSS_DEBUG
#define TSPERR(x)		LogTSPERR(x, __FILE__, __LINE__)
#define TCSERR(x)		LogTCSERR(x, __FILE__, __LINE__)
#define TDDLERR(x)		LogTDDLERR(x, __FILE__, __LINE__)
#elif defined (TSS_TRACE)
#define TSPERR(x)		LogTSPERR(x, __FILE__, __LINE__)
#define TCSERR(x)		LogTCSERR(x, __FILE__, __LINE__)
#define TDDLERR(x)		LogTDDLERR(x, __FILE__, __LINE__)
#else
#define TSPERR(x)		(x | TSS_LAYER_TSP)
#define TCSERR(x)		(x | TSS_LAYER_TCS)
#define TDDLERR(x)		(x | TSS_LAYER_TDDL)
#endif

extern TSS_UUID	NULL_UUID;
extern TSS_UUID	SRK_UUID;

#define NULL_HOBJECT	0
#define NULL_HCONTEXT	NULL_HOBJECT
#define NULL_HPCRS	NULL_HOBJECT
#define NULL_HENCDATA	NULL_HOBJECT
#define NULL_HKEY	NULL_HOBJECT
#define NULL_HTPM	NULL_HOBJECT
#define NULL_HHASH	NULL_HOBJECT
#define NULL_HPOLICY	NULL_HOBJECT
#define NULL_HDELFAMILY	NULL_HOBJECT
#define NULL_HMIGDATA	NULL_HOBJECT

#define TSS_OBJECT_TYPE_CONTEXT		(0x0e)
#define TSS_OBJECT_TYPE_TPM		(0x0f)

#define TSS_PS_TYPE_NO			(0)

/* Derived Types */
#define TSS_MIGRATION_SCHEME	TSS_MIGRATE_SCHEME

// The TPM's non-volatile flags (TPM_PERMANENT_FLAGS)
#define TSS_TPM_PF_DISABLE_BIT			    (1 << (TPM_PF_DISABLE - 1))
#define TSS_TPM_PF_OWNERSHIP_BIT		    (1 << (TPM_PF_OWNERSHIP - 1))
#define TSS_TPM_PF_DEACTIVATED_BIT		    (1 << (TPM_PF_DEACTIVATED - 1))
#define TSS_TPM_PF_READPUBEK_BIT		    (1 << (TPM_PF_READPUBEK - 1))
#define TSS_TPM_PF_DISABLEOWNERCLEAR_BIT	    (1 << (TPM_PF_DISABLEOWNERCLEAR - 1))
#define TSS_TPM_PF_ALLOWMAINTENANCE_BIT		    (1 << (TPM_PF_ALLOWMAINTENANCE - 1))
#define TSS_TPM_PF_PHYSICALPRESENCELIFETIMELOCK_BIT (1 << (TPM_PF_PHYSICALPRESENCELIFETIMELOCK - 1))
#define TSS_TPM_PF_PHYSICALPRESENCEHWENABLE_BIT	    (1 << (TPM_PF_PHYSICALPRESENCEHWENABLE - 1))
#define TSS_TPM_PF_PHYSICALPRESENCECMDENABLE_BIT    (1 << (TPM_PF_PHYSICALPRESENCECMDENABLE - 1))
#define TSS_TPM_PF_CEKPUSED_BIT			    (1 << (TPM_PF_CEKPUSED - 1))
#define TSS_TPM_PF_TPMPOST_BIT			    (1 << (TPM_PF_TPMPOST - 1))
#define TSS_TPM_PF_TPMPOSTLOCK_BIT		    (1 << (TPM_PF_TPMPOSTLOCK - 1))
#define TSS_TPM_PF_FIPS_BIT			    (1 << (TPM_PF_FIPS - 1))
#define TSS_TPM_PF_OPERATOR_BIT			    (1 << (TPM_PF_OPERATOR - 1))
#define TSS_TPM_PF_ENABLEREVOKEEK_BIT		    (1 << (TPM_PF_ENABLEREVOKEEK - 1))
#define TSS_TPM_PF_NV_LOCKED_BIT		    (1 << (TPM_PF_NV_LOCKED - 1))
#define TSS_TPM_PF_READSRKPUB_BIT		    (1 << (TPM_PF_READSRKPUB - 1))
#define TSS_TPM_PF_RESETESTABLISHMENTBIT_BIT	    (1 << (TPM_PF_RESETESTABLISHMENTBIT - 1))
#define TSS_TPM_PF_MAINTENANCEDONE_BIT		    (1 << (TPM_PF_MAINTENANCEDONE - 1))

// The TPM's volatile flags (TPM_STCLEAR_FLAGS)
#define TSS_TPM_SF_DEACTIVATED_BIT	    (1 << (TPM_SF_DEACTIVATED - 1))
#define TSS_TPM_SF_DISABLEFORCECLEAR_BIT    (1 << (TPM_SF_DISABLEFORCECLEAR - 1))
#define TSS_TPM_SF_PHYSICALPRESENCE_BIT     (1 << (TPM_SF_PHYSICALPRESENCE - 1))
#define TSS_TPM_SF_PHYSICALPRESENCELOCK_BIT (1 << (TPM_SF_PHYSICALPRESENCELOCK - 1))
#define TSS_TPM_SF_GLOBALLOCK_BIT	    (1 << (TPM_SF_GLOBALLOCK - 1))

// Trousers key formats to ease use of the different TPM_KEY structs
typedef struct tdTSS_KEY11_HDR {
	TPM_STRUCT_VER ver;
} TSS_KEY11_HDR;

typedef struct tdTSS_KEY12_HDR {
	TPM_STRUCTURE_TAG tag;
	UINT16 fill;
} __attribute__((packed)) TSS_KEY12_HDR;

typedef struct tdTSS_KEY {
	union {
		TSS_KEY11_HDR key11;
		TSS_KEY12_HDR key12;
	} hdr;
	TPM_KEY_USAGE keyUsage;
	TPM_KEY_FLAGS keyFlags;
	TPM_AUTH_DATA_USAGE authDataUsage;
	TPM_KEY_PARMS algorithmParms;
	UINT32 PCRInfoSize;
	BYTE *PCRInfo;
	TPM_STORE_PUBKEY pubKey;
	UINT32 encSize;
	BYTE *encData;
} TSS_KEY;

#if (defined (__linux) || defined (linux) || defined (SOLARIS) || defined (__GLIBC__))
#define BSD_CONST
#elif (defined (__OpenBSD__) || defined (__FreeBSD__))
#define BSD_CONST const
#endif


#endif
